package edu.zzu.service;

import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

/**
 * @Author: GaoPeng
 * @Date: 2021/3/20 18:47
 */
@Service
@CrossOrigin
@RequestMapping("/packageService")
public interface PackageService {

    /**
     * 通过寄件人手机号返回包裹信息
     * @param tel
     * @return json格式的字符串，包括包裹的全部信息，通过发件人手机号可能得到包含多个包裹，因为一个人在一段时间内可能寄出了多个包裹
     */
    @GetMapping("/getPackageBySenderTel/{tel}")
    String getPackageBySenderTel(@PathVariable String tel);

    @GetMapping("/getPackageDetailBySenderTel/{tel}")
    String getPackageDetailBySenderTel(@PathVariable String tel);

    /**
     * 收件人
     * @param tel
     * @return json格式的字符串，包括包裹的全部信息，通过收件人手机号可能得到包含多个包裹，因为一个人在一段时间内可能寄出了多个包裹
     */
    @GetMapping("/getPackageByReceiverTel/{tel}")
    String getPackageByReceiverTel(@PathVariable String tel);

    @GetMapping("/getPackageDetailByReceiverTel/{tel}")
    String getPackageDetailByReceiverTel(@PathVariable String tel);

    /**
     * 保存包裹
     * @param id 运单号
     * @param sourceNode 起始节点
     * @param targetNode 目标节点
     * @param updateTime 更新时间
     * @param status 当前状态
     * @param sender 寄件人
     * @param receiver 收件人
     * @param senderTel 寄件人电话
     * @param receiverTel 收件人电话
     * @param handler 处理人
     * @param userId 用户id，这个主要是记录申请上门取件用户的id，可以不填
     * @param transNodeId 当前所处的转运节点
     * @param senderAddr 寄件人详细地址
     * @param receiverAddr 收件人详细地址
     * @return 保存成功返回true
     */
    @PostMapping("/savePackage")
    boolean savePackage(@RequestParam("id")String id,@RequestParam("sourceNode")String sourceNode,@RequestParam("targetNode")String targetNode,
                        @RequestParam("updateTime")String updateTime,@RequestParam("status")Integer status,@RequestParam("sender")String sender,
                        @RequestParam("receiver")String receiver,@RequestParam("senderTel")String senderTel,@RequestParam("receiverTel")String receiverTel,
                        @RequestParam("handler")Long handler,@RequestParam("userId")Long userId,@RequestParam("transNodeId")Long transNodeId,
                        @RequestParam("senderAddr")String senderAddr,@RequestParam("receiverAddr")String receiverAddr,@RequestParam("x") Float x,
                        @RequestParam("y") Float y);

    /**
     * 生成13位运单号，保证运单号唯一
     * @return
     */
    @GetMapping("/produceRandomPackageId")
    String produceRandomPackageId();

    /**
     * 更新包裹状态
     * @param id 运单号
     * @param status 当前状态
     * @param handler 处理人
     * @param transNodeId 所处转运节点
     * @return 更新成功返回true
     */
    @PostMapping("/updatePackageStatusById")
    boolean updatePackageStatusById(@RequestParam("id") String id,@RequestParam("status") Integer status,
                                    @RequestParam("handler")Long handler,@RequestParam("transNodeId")Long transNodeId,
                                    @RequestParam("x")Float x,@RequestParam("y")Float y);

    /**
     * 获取待揽收任务列表
     * @param regionCode 地区代码，具体到区/县
     * @return json格式的揽收任务列表,每一个揽收任务包括：packageId：运单号,submitTime：提交时间,sender：寄件人,senderTel：寄件人电话,senderAddr：寄件地址
     */
    @GetMapping("/getDLSTask/{regionCode}")
    String getDLSTask(@PathVariable String regionCode);

    /**
     * 获取派送任务列表
     * @param handler 派送员id
     * @return json格式的派送任务列表，每一个派送任务包括：packageId：运单号,updateTime：更新时间,receiver：收货人,receiverTel：收货人电话,receiverAddr：收货人地址
     */
    @GetMapping("/getDeliveryTaskByHandler/{handler}")
    String getDeliveryTaskByHandler(@PathVariable Long handler);

    /**
     * 通过运单号查询包裹信息
     * @param id
     * @return json格式的package
     */
    @GetMapping("/getPackageById/{id}")
    String getPackageById(@PathVariable String id);

    /**
     * 将transNode换成了详细地址
     * @param id
     * @return
     */
    @GetMapping("/getPackageDetailById/{id}")
    String getPackageDetailById(@PathVariable String id);

    /**
     * 通过运单号查询包裹是否存在
     * @param id
     * @return
     */
    @GetMapping("/checkPackageExistById/{id}")
    Boolean checkPackageExistById(@PathVariable String id);

    /**
     * 统计指定快递节点的包裹数量
     * @param id
     * @return
     */
    @GetMapping("/getPackageAmountByTransNodeId/{id}")
    Long getPackageAmountByTransNodeId(@PathVariable Long id);

    /**
     * 查询一个快递节点内的所有包裹
     * @param id
     * @return
     */
    @GetMapping("/getAllPackagesOfTransNode/{id}")
    String getAllPackagesOfTransNode(@PathVariable Long id);

    /**
     * 获得指定状态的所有包裹
     * @param status
     * @return
     */
    @GetMapping("/getPackagesByStatus/{status}")
    String getPackagesByStatus(@PathVariable Integer status);
}
